/**
  ****************************(C) COPYRIGHT 2019 DJI****************************
  * @file       gimbal_task.c/h
  * @brief      完成云台控制任务，由于云台使用陀螺仪解算出的角度，其范围在（-pi,pi）
  *             故而设置目标角度均为范围，存在许多对角度计算的函数。云台主要分为2种
  *             状态，陀螺仪控制状态是利用板载陀螺仪解算的姿态角进行控制，编码器控制
  *             状态是通过电机反馈的编码值控制的校准，此外还有校准状态，停止状态等。
  * @note       
  * @history
  *  Version    Date            Author          Modification
  *  V1.0.0     Dec-26-2018     RM              1. done
  *  V1.1.0     Nov-11-2019     RM              1. add some annotation
  *
  ****************************(C) COPYRIGHT 2019 DJI****************************
  */
#ifndef GIMBAL_BEHAVIOUR_H
#define GIMBAL_BEHAVIOUR_H
#include "struct_typedef.h"

#include "gimbal_task.h"
typedef enum
{
  GIMBAL_ZERO_FORCE = 0,    //云台电机CAN发送的控制值为0，云台表现为无力状态，应用于遥控器开关处于下位，需要云台停止运动的场合。 
  GIMBAL_INIT,              //云台初始化模式，云台先缓慢抬起pitch轴，之后旋转yaw轴至云台中点，应用于云台从停止运动到开启运动控制的过程阶段，防止云台在开电时过度运动导致机械机构损坏。
  GIMBAL_CALI,              //云台校准模式，用于云台计算云台中值的场合，云台先放下pitch轴，再抬起pitch轴，再逆时针旋转yaw轴，最后顺时针旋转yaw轴。在这个过程中，采集电机的反馈角度，用于计算云台中值 。 
  GIMBAL_ABSOLUTE_ANGLE,    //云台使用姿态解算出的姿态角进行角度控制，由于姿态角是相对地面坐标系，不随底盘的姿态角度而不变化，适用于机器人正常运动控制。
  GIMBAL_AUTO,              //云台自动模式，云台在特殊场合下，需要自动控制。
} gimbal_behaviour_e;


/*被gimbal_set_mode函数调用在gimbal_task.c,云台行为状态机以及电机状态机设置*/
extern void gimbal_behaviour_mode_set(gimbal_control_t *gimbal_mode_set);

/**
  * @brief          云台行为控制，根据不同行为采用不同控制函数
  * @param[out]     add_yaw:设置的yaw角度增加值，单位 rad
  * @param[out]     add_pitch:设置的pitch角度增加值，单位 rad
  * @param[in]      gimbal_mode_set:云台数据指针
  * @retval         none
  */
extern void gimbal_behaviour_control_set(fp32 *add_yaw, fp32 *add_pitch, gimbal_control_t *gimbal_control_set);


/*云台在某些行为下，需要底盘不动*/
extern bool_t gimbal_cmd_to_chassis_stop(void);

/*云台在某些行为下，需要射击停止*/
extern bool_t gimbal_cmd_to_shoot_stop(void);

#endif
